package com.example.rabbitdemo.message;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Slf4j

@Configuration
public class RabbitMQConfig {
    //    // 定义队列、交换机和路由键的名称
    public static final String QUEUE_NAME = "demo.queue";
    public static final String EXCHANGE_NAME = "demo.exchange";
    public static final String ROUTING_KEY = "demo.routingkey";

    //
//    // 声明一个持久化队列
//    @Bean
//    Queue queue() {
//        return new Queue(QUEUE_NAME, true); // true表示持久化
//    }
//
//    // 声明一个直连交换机
//    @Bean
//    DirectExchange exchange() {
//        return new DirectExchange(EXCHANGE_NAME, true, false); // 持久化，不自动删除
//    }
//
//    // 将队列与交换机绑定，并指定路由键
//    @Bean
//    Binding binding(Queue queue, DirectExchange exchange) {
//        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
//    }
    @Autowired
    public void configureRabbitTemplate(RabbitTemplate rabbitTemplate) {
        // 设置 ReturnCallback，处理消息无法路由到队列的情况
        rabbitTemplate.setReturnsCallback(returnedMessage -> {
            log.error("🚨 消息路由失败！交换机：{}，路由键：{}，回复码：{}，原因：{}",
                    returnedMessage.getExchange(),
                    returnedMessage.getRoutingKey(),
                    returnedMessage.getReplyCode(),
                    returnedMessage.getReplyText());
            // 此处可加入业务逻辑，如记录日志库、告警、重发等
        });

        // 设置 ConfirmCallback，处理消息是否成功到达交换机的确认
        rabbitTemplate.setConfirmCallback(
                (correlationData, ack, cause) -> {
                    if (ack) {
                        log.debug("✅ 消息成功到达交换机，ID：{}", correlationData.getId());
                        // 成功后可更新数据库状态等
                    } else {
                        log.error("❌ 消息未能到达交换机，ID：{}，原因：{}", correlationData.getId(), cause);
                        // 失败后可触发重发逻辑
                    }
                });
    }
    // 发送消息时，携带 CorrelationData
//    public void sendMessage() {
//        String message = "重要业务消息";
//        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
//        rabbitTemplate.convertAndSend("my.exchange", "my.routing.key", message, correlationData);
//    }
}